package com.liusr.template.common.security;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.liusr.template.constant.BaseConstants;
import com.liusr.template.constant.StringConstants;
import com.liusr.template.exception.NoLoginException;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 * @author Liusr
 * @date 2023/1/23
 * @package com.liusr.template.common.security
 * @Description: JwtToken生成类
 */
@Slf4j
public class JwtToken {

	/**
	 * 生成Token
	 *
	 * @param userId   用户ID（唯一标识）
	 * @param username 用户名（唯一标识）
	 * @param password 密码
	 * @param request  request
	 * @return String
	 */
	public static String getJwtToken(String userId, String username, String password, HttpServletRequest request) {
		return getJwtToken(userId, username, password, 0L, request);
	}


	/**
	 * 生成Token
	 *
	 * @param userId     用户ID（唯一标识）
	 * @param username   用户名（唯一标识）
	 * @param password   密码
	 * @param expireTime 过期时间
	 * @param request    request
	 * @return String
	 */
	public static String getJwtToken(String userId, String username, String password, Long expireTime, HttpServletRequest request) {
		//过期时间
		Date date;
		if (expireTime == null || expireTime == 0) {
			//默认过期时间5分钟
			date = new Date(System.currentTimeMillis() + BaseConstants.TOKEN_EXPIRE_TIME);
		} else {
			date = new Date(System.currentTimeMillis() + expireTime);
		}

		//创建Token
		String token = JWT.create()
				//签收者
				.withAudience(userId, username)
				//主题
				.withSubject("token")
				//过期时间
				.withExpiresAt(date)
				//token密匙
				.sign(Algorithm.HMAC256(password));

		//将Token存到Session中
		HttpSession session = request.getSession();
		session.setAttribute("token", token);

		return token;
	}


	/**
	 * 判断Token是否存在并且是否正确（和Session中是否一致）
	 *
	 * @param token token
	 * @return boolean
	 */
	public static boolean judgeTokenIsExitsAndCorrect(String token, HttpServletRequest request) {

		//从Session中获取Token
		HttpSession session = request.getSession();
		String tokenSession = (String) session.getAttribute("token");
		if (tokenSession == null) {
			log.error("Session不存在");
			throw new NoLoginException(StringConstants.EXCEPTION_NO_LOGIN_SESSION);
		}

		//判断传进来的token和Session中的token是否相等，并返回结果
		return tokenSession.equals(token);
	}
}
